class Pregunta < ActiveRecord::Base

  #Relaciones
  belongs_to :competencia
  belongs_to :evaluacion
  has_many :usuarios_preguntas, :dependent => :destroy
  belongs_to :cargo
  has_many :respuestas, :dependent => :destroy
  has_many :opciones,   :dependent   => :destroy

  default_scope :order=>"preguntas.competencia_tipo,preguntas.competencia_nombre,preguntas.texto"

  named_scope :por_competencia, lambda { |competencia_id| {:conditions => ['competencia_id = ?', competencia_id] }}

  named_scope :competencias_cargo, lambda { |cargo_id| {:include => :competencia,
      :conditions => ['((competencias.tipo = \'general\' OR preguntas.cargo_id IS NULL) OR preguntas.cargo_id = ?) AND preguntas.competencia_id IN (?)',
        cargo_id, CompetenciaCargo.ids_competencias(cargo_id)+Competencia.ids_generales] }}


  named_scope :por_cargo, lambda { |cargo| {:conditions => ['cargo_id = ?', cargo.id] }}

  named_scope :por_evaluacion, lambda { |eva| {:conditions => ['evaluacion_id = ?', eva.id] }}

  named_scope :competencias_generales, {:include => :competencia, :conditions => ['competencias.tipo = \'general\''] }
  named_scope :competencias_especificas, lambda {|cargo| {:include => :competencia, :conditions => ['competencias.tipo = \'especifica\' AND preguntas.cargo_id = ? AND preguntas.competencia_id IN (?)', cargo.id, cargo.competencia_ids] }}

  validates_presence_of :texto

  after_update :save_opciones
  after_create :save_competencia

  #  attr_writer :competencia_nombre
  #  delegate :nombre, :to => :competencia, :prefix => true, :allow_nil => true

  def self.find_all_by_competencia_and_cargo(cargo)
    competencias_cargo(cargo).por_cargo(cargo) if cargo
  end

  def self.find_all_by_competencia(evaluacion_id)
    preguntas = find(:all, :conditions => ['evaluacion_id = ?', evaluacion_id])
  end

  #  def competencia_nombre
  #    self.competencia.try(:nombre)
  #  end

  def new_opcion_attributes=(opcion_attributes)
    opcion_attributes.each do |attributes|
      opciones.build(attributes) unless attributes.values.any?(&:blank?)
    end
  end

  def existing_opcion_attributes=(opcion_attributes)
    opciones.reject(&:new_record?).each do |opcion|
      attributes = opcion_attributes[opcion.id.to_s]
      if attributes
        opcion.attributes = attributes
      else
        opcion.destroy
      end
    end
  end

  def save_competencia
    self.competencia_nombre=self.competencia.titulo
    self.competencia_tipo=self.competencia.tipo
    self.save
  end
  def save_opciones
    opciones.each do |opcion|
      opcion.save
    end
  end

  def peor_opcion
    opciones.minimum(:valor, :conditions => "pregunta_id = #{self.id}")
  end

  def new_respuesta_attributes=(respuesta_attributes)
    respuesta_attributes.each do |attributes|
      respuestas.build(attributes) unless attributes.values.any?(&:blank?)
    end
  end

  def existing_respuesta_attributes=(respuesta_attributes)
    respuestas.reject(&:new_record?).each do |respuesta|
      attributes = respuesta_attributes[respuesta.id.to_s]
      if attributes
        respuesta.attributes = attributes
      else
        respuesta.destroy
      end
    end
  end

  def maxima_opcion
    opciones ? opciones.maximum('valor') : 0.00
  end

  def save_respuesta
    respuestas.each do |respuesta|
      respuesta.save
    end
  end

  def all_data(sep='-')
    "#{competencia_id}#{evaluacion_id}#{sep}#{cargo_id}#{sep}#{competencia_nombre}#{sep}#{competencia_tipo}#{sep}#{texto.hash}"
  end
end

